/*
 * terminales-servidor.cpp
 *
 *  Created on: 09/09/2011
 *      Author: guido
 */

#include "terminales-server.h"
#include "canal.h"
#include "serializador.h"
#include "fabrica-mensajes.h"
#include "habitacion.h"
#include "respuesta-error.h"
#include "respuesta-ok.h"
#include "consumo.h"
#include "estado.h"
#include "ingreso.h"
#include "salida.h"
#include <sstream>


class Habitacion;

TerminalesServer::TerminalesServer() {
	buffer = 0;
}

TerminalesServer::~TerminalesServer() {
	delete[] buffer;
}

void TerminalesServer::operator>>(Canal & canal) {
	int tamanyo;
	mensajeRespuesta->serializar(buffer, tamanyo);
	delete (mensajeRespuesta);
	canal.recibirMensaje(buffer, tamanyo);
	delete[] buffer; buffer = 0;
}

void TerminalesServer::operator<<(Canal & canal) {
	canal.enviarMensaje(buffer);
	FabricaMensajes fabrica;
	mensajeConsulta = fabrica.getInstanciaConsulta(buffer[0]);
	mensajeConsulta->deserializar((char*)buffer);
	mensajeConsulta->responder(*this);
	delete(mensajeConsulta);
	delete[] buffer; buffer = 0;
}

void TerminalesServer::responderIngreso(Ingreso* ingreso) {
	bool ocupada = registros.habitacionEstaOcupada(ingreso->getNumero());
	if (ocupada) {
		mensajeRespuesta = new RespuestaError(MSG_HABITACION_OCUPADA);
	} else {
		mensajeRespuesta = new RespuestaOK();
		registros.hospedar(ingreso->getNumero(), ingreso->getNombre(),
				ingreso->getBalance());
	}
}

void TerminalesServer::responderConsumo(Consumo *consumo) {
	bool ocupada = registros.habitacionEstaOcupada(consumo->getNumero());
	if (!ocupada) {
		mensajeRespuesta = new RespuestaError(MSG_HABITACION_NO_OCUPADA);
	} else {
		mensajeRespuesta = new RespuestaOK();
		registros.descontar(consumo->getNumero(), consumo->getMonto());
	}
}

void TerminalesServer::responderEstado(Estado *estado) {
	bool ocupada = registros.habitacionEstaOcupada(estado->getNumero());
	if (!ocupada) {
		mensajeRespuesta = new RespuestaError(MSG_HABITACION_NO_OCUPADA);
	} else {
		int saldo = registros.saldo(estado->getNumero());
		std::stringstream ss;
		ss << saldo;
		std::string temp = ss.str();
		temp = MSG_GASTO + temp;
		mensajeRespuesta = new RespuestaOK(temp);
	}
}

void TerminalesServer::responderSalida(Salida *salida) {
	bool ocupada = registros.habitacionEstaOcupada(salida->getNumero());
	if (!ocupada) {
		mensajeRespuesta = new RespuestaError(MSG_HABITACION_NO_OCUPADA);
	} else {
		int saldo = 0;
		saldo = registros.checkout(salida->getNumero());
		std::stringstream ss;
		ss << saldo;
		std::string temp = MSG_SALDO + ss.str();
		mensajeRespuesta = new RespuestaOK(temp);
	}
}

